package br.com.coes.beans.agenda;
 
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.ScheduleEntryMoveEvent;
import org.primefaces.event.ScheduleEntryResizeEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;

import br.com.coes.vo.AgendaVO;
 
@ManagedBean(name="agendaBean")
@ViewScoped
public class AgendaBean implements Serializable {
 
	private static final long serialVersionUID = 8673043504918116072L;

	private AgendaVO agenda;

    private ScheduleModel eventModel;

    private List<AgendaVO> listaAgenda;

    /**
     * Metodo para inicializar a nossa agenda. Atraves deste metodo retornamos
     * a lista de eventos e montamos nosso calendario ScheduleModel atraves de um 
     * DefaultScheduleModel
     */
    @PostConstruct
    private void inicializar(){

        agenda = new AgendaVO();
        eventModel = new DefaultScheduleModel();

        //recupera a lista de eventos
        if (listaAgenda == null) {
        	listaAgenda = new ArrayList<AgendaVO>();
        }

        //percorre a lista de eventos e popula o calendario
        for(AgendaVO agenda : listaAgenda){

            DefaultScheduleEvent evento = new DefaultScheduleEvent();
            evento.setAllDay(agenda.isDiaTodo());
            evento.setEndDate(agenda.getDataFim());
            evento.setStartDate(agenda.getDataInicio());
            evento.setTitle(agenda.getDescricao());
            evento.setData(agenda.getId());
            evento.setEditable(true); //pertir que o usuario edite

            /*if(agenda.getTipoAgenda().equals(TipoAgenda.GLOBAL)){
                evento.setStyleClass("global");
            }else{
                evento.setStyleClass("pessoal");
            }*/

            eventModel.addEvent(evento); //o evento e adicionado na lista
        }
    }

    /**
     * Metodo para salvar o evento
     */
    public void salvar(){

        //se o ID for zero tenho que incluir na lista
        //caso contrario nao e necessario
        if(agenda.getId() == 0){ 

            //uma validacao basica para verificar se o usuario informou 
            //as datas corretamente
            if(agenda.getDataInicio().getTime() <= agenda.getDataFim().getTime()){

//                agenda.setTipoAgenda(tipoAgenda);
//                agendaBO.adicionarAgenda(agenda);
            	listaAgenda.add(agenda);
                agenda = new AgendaVO();
                
                inicializar();

            }else{
                //a data de inicio nao pode ser maior que a data final
            }

        }else{
            inicializar();
        }
    }

    /**
     * Evento para quando o usuario clica em um espaco em branco no calendario
     * @param selectEvent 
     */
    public void quandoNovo(SelectEvent selectEvent) {  

        ScheduleEvent event = new DefaultScheduleEvent("", 
                (Date) selectEvent.getObject(), (Date) selectEvent.getObject());  

        agenda = new AgendaVO();
        //recupero a data em q ele clicou
        agenda.setDataInicio(event.getStartDate());
        agenda.setDataFim(event.getEndDate());
    }

    /**
     * Evento para quando usuario clica em um enveto ja existente
     * @param selectEvent 
     */
    public void quandoSelecionado(SelectEvent selectEvent) {  

        ScheduleEvent event = (ScheduleEvent) selectEvent.getObject();  

        for(AgendaVO agda : listaAgenda){
            if(agda.getId() == (Integer)event.getData()){
                agenda = agda;
                break;
            }
        }
    }  

    /**
     * Evento para quando o usuario 'move' um evento atraves de 'drag and drop'
     * @param event 
     */
    public void quandoMovido(ScheduleEntryMoveEvent event) {  

        for(AgendaVO agda : listaAgenda){

            if(agda.getId() == (Integer)event.getScheduleEvent().getData()){
                agenda = agda;
                //salvar sua agenda no banco
                break;
            }
        }
    }  

    /**
     * Evento para quando o usuario 'redimenciona' um evento
     * @param event 
     */
    public void quandoRedimensionado(ScheduleEntryResizeEvent event) {  

        for(AgendaVO agda : listaAgenda){
            if(agda.getId() == (Integer)event.getScheduleEvent().getData()){
                agenda = agda;
                //salvar sua agenda no banco
                break;
            }
        }
    }  

    //getters and setters
    public List<AgendaVO> getListaAgenda() {
        return listaAgenda;
    }

    public void setListaAgenda(List<AgendaVO> listaAgenda) {
        this.listaAgenda = listaAgenda;
    }

    public AgendaVO getAgenda() {
        return agenda;
    }

    public void setAgenda(AgendaVO agenda) {
        this.agenda = agenda;
    }

    public ScheduleModel getEventModel() {
        return eventModel;
    }

    public void setEventModel(ScheduleModel eventModel) {
        this.eventModel = eventModel;
    }

}
